草庐IT

C++ operator+ 和 operator+= 重载

全部标签

c++ - 当派生类中存在另一个重载时无法调用基类的方法

编译以下代码时出现编译器错误“函数不接受0个参数”。classA{public:intFoo(){return1;}protected:virtualvoidFoo(int&n){n+=1;}};classB:publicA{protected://OverrideofAvoidFoo(int&n){n+=2;}};intmain(intargc,char*argv[]){Bb;intn=b.Foo();returnn;}看起来编译器坚持调用重载B::Foo(int&)而不是A::Foo()。我一定在这里遗漏了一些明显的东西。任何指向解释编译器行为的C++标准的指针都将受到赞赏。我确实

C++11统一初始化和函数重载

简单程序:voidf(conststd::string&s);voidf(constchar*p);f({});为什么clang调用f((constchar*)nullptr)?我已经预料到编译器会发出关于不明确调用的警告。 最佳答案 这包含在C++11标准草案13.3.3.1.5[over.ics.list]中,它说:Otherwise,iftheparametertypeisnotaclass:[...]iftheinitializerlisthasnoelements,theimplicitconversionsequence

c++ std::forward 在容器上调用 operator[]

《EffectivemodernC++》一书中第3条写了这样一段代码:templatedecltype(auto)authAndAccess(Container&&c,Indexi){authenticateUser();returnstd::forward(c)[i];}我不明白你为什么调用std::forward?如果c是右值引用,那么在右值而不是左值上调用operator[]会发生什么变化?对我来说c[i]应该足够了。PS:当变量是函数的参数时,我理解std::forward的目的是:templatestd::unique_ptrmake_unique(Ts&&...params

具有实矩阵和复矩阵的矩阵类的 C++ 运算符重载

我正在尝试实现一个可以处理实矩阵和复矩阵的矩阵类。当我尝试重载乘法运算符时遇到问题。具体来说,当我尝试将double矩阵乘以复数矩阵时(按此顺序)。结果应该很复杂,但在这种情况下*运算符是双矩阵的成员,我不知道如何返回复数矩阵(我试过使用友元运算符,这似乎也不起作用).这是相关的代码片段:templateMatrixoperator*(constMatrix&b){longi,j,k;Ttemp;Matrixc(mRows,b.Cols());for(i=0;iElement(i,k)*b.Element(k,j);c(i,j)=temp;}returnc;}因此,如果A是实数,并且B

模板参数上的 C++ 函数模板重载

是否可以像这样重载函数模板(仅在使用enable_if的模板参数上):template::value>>voidfn(Tt){}template::value>>voidfn(Tt){}如果enable_if中的条件不重叠?我的MSVS编译器提示说,'voidfn(T)':functiontemplatehasalreadybeendefined。如果不是,替代方案是什么(最好不要将enable_if放在模板参数以外的任何地方)? 最佳答案 默认参数在确定函数的唯一性方面不起作用。所以编译器看到的是您定义了两个函数,例如:templ

函数重载的 C++ 后期绑定(bind)

假设我有这两个类:classHello{//memberspublic:virtualintdoit(){return3;}};classWow:publicHello{//memberspublic:virtualintdoit(){return2;}};intmain(intargc,constchar*argv[]){Hello*c=newWow();returnc->doit();}众所周知,这段代码将由C++中的后期绑定(bind)处理,由Clang在LLVMIR中实现,如下所示:;...%7=bitcast%class.Wow*%5to%class.Hello*store%

c++ - 使用(模板化的)删除函数重载来防止通常的算术转换

我经常发现我想阻止特定构造函数或函数的缩小或符号转换(通常是Usualarithmeticconversions)。我倾向于写:#includevoidfoo(doublef){std::coutvoidfoo(T&&f)=delete;voidbar(unsignedintf){std::coutvoidbar(T&&f)=delete;这样就可以了...intmain(){autoi=2;autod=2.0;autof=2.0f;foo(i);//preventedfoo(d);//OKfoo(f);//preventedautouil=3ull;autoul=3ul;autou=

c++ - 是否有任何理由使用右值引用来重载运算符?

有模板化的vector类(它是关于数学的,而不是容器)。我需要重载常见的数学运算。像这样重载有什么意义吗:templateVectoroperator+(constVector&left,constVector&right){std::coutresult;for(size_ti=0;iVector&&operator+(constVector&left,Vector&&right){std::coutVector&&operator+(Vector&&left,constVector&right){std::cout这个测试代码工作得很好:autov1=math::Vector(1)

C++ || 类的八种函数 | 默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载 | const成员函数 | 取地址及const取地址操作符重载

默认成员函数默认成员函数定义当一个类中什么成员都没有时,简称为空类。空类中真的什么都没有吗?并不是,在任何类只什么都没有的话,编译器就会自动生成以下6种默认成员函数。默认成员函数:用户没有显式实现,编译器自动生成的成员函数称为默认成员函数。C++中,6个默认成员函数。类中的成员函数,不仅仅局限于以下六种,仅仅只是以下六种,在用户没有显式实现的情况,编译器可以自动生成的成员函数。默认成员函数分类构造函数构造函数定义构造函数是特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证类中的每个成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。简单来说,就是类似于初始化In

c++ - 显式调用 `operator new` 后无法访问对象的函数

我正在做一个项目,我必须实现newoperator和deleteoperator,并通过我自己的MemoryManager管理我的内存-它有可用内存列表.为了分配我的列表和节点(不需要管理),我应该在调用malloc之后显式调用operatornew。当我尝试调用一个函数-setNext()时,它抛出异常:Exception:EXC_BAD_ACCESS(code=1,address=0x0)创建链表的哈希表:MyHashTable::MyHashTable(size_tmemorySize,void*startingPtr):size(getLowerLog(memorySize)+